#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "SimplePing.h"

// 错误类型枚举
typedef NS_ENUM(NSInteger, HDPingErrorCode) {
    HDPingErrorRequest = 1001,  // 发起失败
    HDPingErrorReceive = 1002,  // 响应失败
    HDPingErrorTimeout = 1003   // 超时
};

// 自定义错误域
extern NSString *const kHDPingErrorDomain;

// 时间单位枚举
typedef NS_ENUM(NSInteger, HDPingTimeIntervalType) {
    HDPingTimeIntervalTypeSecond,      // 秒
    HDPingTimeIntervalTypeMillisecond, // 毫秒
    HDPingTimeIntervalTypeMicrosecond  // 微秒
};

// 时间间隔模型（替代 Swift 枚举关联值）
@interface HDPingTimeInterval : NSObject
@property (nonatomic, assign, readonly) HDPingTimeIntervalType type;
@property (nonatomic, assign, readonly) NSTimeInterval value;
@property (nonatomic, assign, readonly) NSTimeInterval secondValue; // 统一转为秒

// 构造方法
+ (instancetype)intervalWithSecond:(NSTimeInterval)second;
+ (instancetype)intervalWithMillisecond:(NSTimeInterval)millisecond;
+ (instancetype)intervalWithMicrosecond:(NSTimeInterval)microsecond;

@end

// Ping 响应模型
@interface HDPingResponse : NSObject
@property (nonatomic, copy) NSString *pingAddressIP;       // 目标IP
@property (nonatomic, strong) HDPingTimeInterval *responseTime; // 响应时间
@property (nonatomic, assign) NSInteger responseBytes;     // 响应数据长度

@end

// 状态栏网络指示器状态
typedef NS_ENUM(NSInteger, HDNetworkActivityIndicatorStatus) {
    HDNetworkActivityIndicatorStatusAuto,   // 自动显示
    HDNetworkActivityIndicatorStatusAlways, // 一直显示
    HDNetworkActivityIndicatorStatusNone    // 不显示
};

// Ping 回调 Block
typedef void(^HDPingCompleteBlock)(HDPingResponse * _Nullable response, NSError * _Nullable error);

// 内部 Ping 任务模型（存储发送时间和序列号）
@interface HDPingItem : NSObject
@property (nonatomic, strong) NSDate *sendTime;
@property (nonatomic, assign) UInt16 sequence;

@end

// 状态栏网络指示器管理（单例）
@interface HDPingNetworkActivityIndicator : NSObject
@property (nonatomic, assign) BOOL isHidden; // 是否隐藏
+ (instancetype)sharedIndicator;
- (void)updateWithTime:(NSInteger)time; // 更新指示器（time 为响应时间，单位ms）

@end

// 核心 Ping 工具类
@interface WKPingTools : NSObject <SimplePingDelegate>
@property (nonatomic, strong) HDPingTimeInterval *timeout; // 超时时间（默认1000ms）
@property (nonatomic, assign) BOOL debugLog;               // 是否开启日志
@property (nonatomic, assign) BOOL stopWhenError;          // 错误时是否停止
@property (nonatomic, assign, readonly) BOOL isPing;       // 是否正在 Ping
@property (nonatomic, assign, readonly) BOOL isRunning;    // 是否正在运行
@property (nonatomic, assign) HDNetworkActivityIndicatorStatus showNetworkActivityIndicator; // 状态栏显示模式
@property (nonatomic, copy, readonly) NSString *hostName;  // 目标主机名

// 构造方法
- (instancetype)initWithHostName:(NSString * _Nullable)hostName;
- (instancetype)initWithURL:(NSURL * _Nullable)url;

// 开始 Ping（默认 IPv4/IPv6 自动适配，无重复间隔）
- (void)startWithComplete:(HDPingCompleteBlock _Nullable)complete;
// 带参数的开始 Ping（指定 IP 类型和重复间隔）
- (void)startWithPingType:(SimplePingAddressStyle)pingType
                  interval:(HDPingTimeInterval * _Nullable)interval
                  complete:(HDPingCompleteBlock _Nullable)complete;

// 停止 Ping
- (void)stop;

@end
